import org.junit.Test;

import java.io.*;

/**
 * * 转换流
 * * InputStreamReader:将一个输入型的字节流转换为输入型的字符流。
 * * OutputStreamWriter:将一个输出型的字符流转化为输出型的字节流。
 * <p>
 * 解码时使用的字符集必须与编码时使用的字符集相同
 * <p>
 * 1. 存储在文件中的字符：
 * ----gbk：用来存储中文简体繁体、英文字母和数字、常用标点符号等字符
 * --------中文字符使用2个字节存储。向下兼容ASCII，意味着英文字符、数字、标点符号仍使用1个字节。
 * ----utf-8：可以用来存储世界范围内主要的语言的所有的字符。使用1-4个不等的字节表示一个字符。
 * -----------中文字符使用3个字节存储。向下兼容ASCII，，意味着英文字符、数字、标点符号仍使用1个字节。
 * ----iso-8859-1：每个字符占用 1 个字节.
 * 2. 在内存中的字符：
 * ----一个字符(char)占用2个字符。在内存中使用的字符集称为 Unicode字符集（万国码）。
 */
public class TransFlowTest {
    /**
     * 将 GBK 编码的文件，转化为utf-8编码的文件存储。
     */
    @Test
    public void test1() {

        try (FileInputStream fis = new FileInputStream("期末总结-GBK.txt");
             FileOutputStream fos = new FileOutputStream("期末总结-copy.txt");
             InputStreamReader inputStreamReader = new InputStreamReader(fis, "GBK");
             OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos)) {
            char[] cBuffer = new char[1024];
            int len;
            while ((len = inputStreamReader.read(cBuffer)) != -1) {
                System.out.println(new String(cBuffer, 0, len));
                outputStreamWriter.write(new String(cBuffer, 0, len));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
